using System;
using System.Windows.Forms;
using App.Git.Vista.Widgets;
using App.Modelo.Attributes;
using App.Modelo.Menu;
using App.Persistencia;
using App.Seguridad.Vista.Menu;
using App.SolInf.Controlador;
using App.SolInf.Modelo;

namespace App.SolInf.Vista.Listado
{
    [Formulario("CategoriasProducto")]
    public class ListadoCategoriasProducto : ListadoBusquedaGenerico
    {
        public Repositorio Repositorio;

        private ControladoraCategoriasProducto _controladoraCategoriasProducto;
        public ControladoraCategoriasProducto ControladoraCategoriasProducto
        {
            get
            {
                return _controladoraCategoriasProducto ??
                       (_controladoraCategoriasProducto =
                        ModuloSolInf.Instance.FabricaControladoras.Factory<ControladoraCategoriasProducto>());
            }
            set
            {
                _controladoraCategoriasProducto = value;
            }
        }
        
			
        public ListadoCategoriasProducto()
        {
            ContenedorModulo = ModuloSolInf.Instance;

            BotonCancelar = BotonSeleccionar = false;
            Repositorio = new Repositorio();

            Text = "Gestion de categoria de Productos";

            AddColumn("Id");
            AddColumn("Descripcion");

            var controladorBoton = new MenuControladoraBotonera
            {
                Controls = ControlesGestion,
                Model = new MenuContenedor(new MenuBaseItem[] {
                        new MenuBoton("Nuevo", "add", "CategoriasProducto/alta"),
                        new MenuBoton("Ver", "view", "CategoriasProducto/ver"),
                        new MenuBoton("Modificar", "edit", "CategoriasProducto/modificar"),
                        new MenuBoton("Eliminar", "delete", "CategoriasProducto/baja")
                    })
            };

            controladorBoton.ExecuteCommand += new EventHandler<MenuEjecutarComandoEventArgs>(controladorBoton_ExecuteCommand);
        }


        void controladorBoton_ExecuteCommand(object sender, MenuEjecutarComandoEventArgs e)
        {
            var item = GetSelectedItem<CategoriaProducto>();

            if (e.Item.Command == "CategoriasProducto/alta")
            {
                new Comandos.ComandoAltaCategoriasProducto().Ejecutar();
            }
            else if (e.Item.Command == "CategoriasProducto/ver" && _seleccionar())
            {
                new GenericEditForm<CategoriaProducto>
                {
                    Item = item,
                    Session = Repositorio
                }.Ver();
            }
            else if (e.Item.Command == "CategoriasProducto/modificar" && _seleccionar())
            {
                new GenericEditForm<CategoriaProducto>
                {
                    Item = item,
                    Session = Repositorio
                }.Modificar();
            }
            else if (e.Item.Command == "CategoriasProducto/baja" && _confirmar())
            {
                try
                {
                    ControladoraCategoriasProducto.Baja(item);
                    MessageBox.Show("Se elimino el item", Text);
                    OnSearch();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }
        }

        
        protected override void OnSearch()
        {
            DataSource = Repositorio.GetAll<CategoriaProducto>();
        }


        [Comando("alta")]
        public void Alta()
        {
            var formCategoriaProducto  = new GenericEditForm<CategoriaProducto>()
            {
                Session = Repositorio
            };

            formCategoriaProducto.Closed += new EventHandler(formCategoriaProducto_Closed);
            formCategoriaProducto.Alta();
        }

        void formCategoriaProducto_Closed(object sender, EventArgs e)
        {
            OnSearch();
            ModuloSolInf.Instance.AbrirFormulario(this);
        }

        [Comando("modificar", "Modifica un cliente existente en la base de datos")]
        public void Modificar()
        {
            ModuloSolInf.Instance.AbrirFormulario(this);
        }

        [Comando("ver")]
        public void Ver()
        {
            ModuloSolInf.Instance.AbrirFormulario(this);
        }

        public void Baja()
        {
            ModuloSolInf.Instance.AbrirFormulario(this);
        }
    }
}